#include "port.h"
#include "sys.h"

/******************************************
 PD3  为系统灯
 PD10 为黄色灯
 PD11 为红色灯
 PE15 为绿色灯
***********************************************/

void led_port_init() {
  GPIO_InitTypeDef GPIO_InitStructure; 
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);//使能GPIOD时钟
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);//使能GPIOE时钟

 
  //GPIOD10,D11初始化设置，PD3 系统板led
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3|GPIO_Pin_10|GPIO_Pin_11;//
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//复用功能
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;//2MHz
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
  GPIO_Init(GPIOD, &GPIO_InitStructure);//初始化

  //GPIOE14,E15初始化设置
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14|GPIO_Pin_15;//
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//复用功能
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;//2MHz
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
  GPIO_Init(GPIOE, &GPIO_InitStructure);//初始化
}

void led_on(enum led_type type){
    switch(type){
        case LED_SYS:
            GPIO_SetBits(GPIOD, GPIO_Pin_3);
        break;
        case LED_GREEN:
            #ifdef GTC_DP1
                GPIO_SetBits(GPIOE, GPIO_Pin_14);
            #else
                GPIO_SetBits(GPIOE, GPIO_Pin_15);
            #endif
            
        break;
        case LED_YELLOW:
            #ifdef GTC_DP1
                GPIO_SetBits(GPIOE, GPIO_Pin_15);
            #else
                GPIO_SetBits(GPIOD, GPIO_Pin_11);
            #endif

        break;
        case LED_RED:
            GPIO_SetBits(GPIOD, GPIO_Pin_10);
        break;
        default:
            
        break;
    }
}

void led_off(enum led_type type) {
    switch(type){
        case LED_SYS:
            GPIO_ResetBits(GPIOD, GPIO_Pin_3);            
        break;
        case LED_GREEN:
            #ifdef GTC_DP1
                GPIO_ResetBits(GPIOE, GPIO_Pin_14);
            #else
                GPIO_ResetBits(GPIOE, GPIO_Pin_15);
            #endif
        break;
        case LED_YELLOW:
            #ifdef GTC_DP1
                GPIO_ResetBits(GPIOE, GPIO_Pin_15);
            #else
                GPIO_ResetBits(GPIOD, GPIO_Pin_11);
            #endif
        break;
        case LED_RED:
            GPIO_ResetBits(GPIOD, GPIO_Pin_10);
        break;
        default:
            
        break;
    }
}

void led_toggle(enum led_type type){
    switch(type){
        case LED_SYS:
            GPIO_ToggleBits(GPIOD, GPIO_Pin_3);
        break;
        case LED_GREEN:
            #ifdef GTC_DP1
                GPIO_ToggleBits(GPIOE, GPIO_Pin_14);
            #else
                GPIO_ToggleBits(GPIOE, GPIO_Pin_15);
            #endif
            
        break;
        case LED_YELLOW:
            #ifdef GTC_DP1
                GPIO_ToggleBits(GPIOE, GPIO_Pin_15);
            #else
                GPIO_ToggleBits(GPIOD, GPIO_Pin_11);
            #endif
            
        break;
        case LED_RED:
            GPIO_ToggleBits(GPIOD, GPIO_Pin_10);
        break;
        default:
            
        break;
    }
}
/*
  PE3 广告灯继电器
  PE6 充电继电器L
  PE9 充电继电器N
  PE1 L线辅助继电器
  PE2 N线辅助继电器
*/

void relay_init(void){
  GPIO_InitTypeDef GPIO_InitStructure; 
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);//使能GPIOE时钟 
    
  //GPIOE4,E5初始化设置
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3|GPIO_Pin_6 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_9;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//输出功能
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;//2MHz
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;//下拉
  GPIO_Init(GPIOE, &GPIO_InitStructure);//初始化  
    
}

void relay_aux_L_on(void){
    GPIO_SetBits(GPIOE, GPIO_Pin_1);
}

void relay_aux_L_off(void){
    GPIO_ResetBits(GPIOE, GPIO_Pin_1);
}

void relay_aux_N_on(void){
    GPIO_SetBits(GPIOE, GPIO_Pin_2);
}

void relay_aux_N_off(void){
    GPIO_ResetBits(GPIOE, GPIO_Pin_2);
}

void relay_charge_l_on(void){
    GPIO_SetBits(GPIOE, GPIO_Pin_6);
}

void relay_charge_l_off(void){
    GPIO_ResetBits(GPIOE, GPIO_Pin_6);
}

void relay_charge_n_on(void){
    GPIO_SetBits(GPIOE, GPIO_Pin_9);
}

void relay_charge_n_off(void){
    GPIO_ResetBits(GPIOE, GPIO_Pin_9);
}

void relay_adv_on(void){
    GPIO_SetBits(GPIOE, GPIO_Pin_3);
}

void relay_adv_off(void){
    GPIO_ResetBits(GPIOE, GPIO_Pin_3);
}

//继电器检测脚 PE7,PE8
void relay_check_port_init(void){
    GPIO_InitTypeDef GPIO_InitStructure; 
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);//使能GPIOE时钟

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7|GPIO_Pin_8;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
    GPIO_Init(GPIOE, &GPIO_InitStructure);//初始化   
}

//继电器L检测管脚
unsigned char relay_read_l_state(void) {
    
    return GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_7);
}

//继电器N检测管脚
unsigned char relay_read_n_state(void) {
    
    return GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_8);
}

//急停检测脚 PE11
void estop_port_init(void){
    GPIO_InitTypeDef GPIO_InitStructure; 
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);//使能GPIOE时钟
    
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
    GPIO_Init(GPIOE, &GPIO_InitStructure);//初始化
}

//急停按钮使用到的管脚为 PE11
unsigned char estop_read_state(void) {
    
    return GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_11);
}

//cc检测脚 PD4
void cc_port_init(void){
    GPIO_InitTypeDef GPIO_InitStructure; 
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);//使能GPIOE时钟

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
    GPIO_Init(GPIOD, &GPIO_InitStructure);//初始化    
}

//cc 管脚状态
unsigned char cc_read_state(void) {
    
    return GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_4);
}

//gprs 管脚
void gprs_port_init(void){
  GPIO_InitTypeDef GPIO_InitStructure; 
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
 
  //GPIOB14,B15初始化设置
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14|GPIO_Pin_15;//
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//复用功能
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;//2MHz
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
  GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化
    
  GPIO_ResetBits(GPIOB, GPIO_Pin_14); //复位脚高电平200ms复位
}

void gprs_power_on(void){
    GPIO_ResetBits(GPIOB, GPIO_Pin_15);
}

void gprs_power_off(void){
    GPIO_SetBits(GPIOB, GPIO_Pin_15);
    
}

//4g管脚与gprs 一致 控制逻辑不同
void w4g_port_init(void){
  GPIO_InitTypeDef GPIO_InitStructure; 
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
 
  //GPIOB14,B15初始化设置
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14|GPIO_Pin_15;//
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//复用功能
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;//2MHz
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
  GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化
    
  w4g_reset_high(); //复位脚低电平200ms复位
  w4g_power_high();  
}

//电平的高低是根据模块管脚实际电平来算的
void w4g_power_low(void){
    GPIO_SetBits(GPIOB, GPIO_Pin_15);
}

void w4g_power_high(void){
    GPIO_ResetBits(GPIOB, GPIO_Pin_15);  
}

void w4g_reset_high(void){
    GPIO_SetBits(GPIOB, GPIO_Pin_14);    
}

void w4g_reset_low(void){
    GPIO_ResetBits(GPIOB, GPIO_Pin_14);
}

/*
lcd 管脚初始化
PC8 RESET
PC9 D/C
PC10 SCL
PC11 SDA
*/
void lcd_port_init(void){
  GPIO_InitTypeDef GPIO_InitStructure; 
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);//使能GPIOE时钟 
    
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//输出功能
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;//下拉
  GPIO_Init(GPIOC, &GPIO_InitStructure);//初始化      
}

//看门狗管脚
#define WDG_ENABLE 0
void wdg_init(void){
    #if WDG_ENABLE
    GPIO_InitTypeDef GPIO_InitStructure; 
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);//使能GPIOE时钟
    
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
    GPIO_Init(GPIOE, &GPIO_InitStructure);//初始化
    #endif
}

void wdg_feed(void){
    #if WDG_ENABLE
    GPIO_ToggleBits(GPIOE, GPIO_Pin_0);
    #endif
}

